import axios from 'axios'
import { Message } from 'element-ui'
import store from '../store/index'
import user from '../store/modules/user'
import { getTimeStamp } from '@/utils/auth'
import router from '@/router'
const service = axios.create({
  // 当执行 npm run dev => .env.development => /api =>跨域代理
  baseURL: process.env.VUE_APP_BASE_API, // /dev-api  /prod-api
  timeout: 5000
})

// 请求拦截器
service.interceptors.request.use((reqConfig) => {
  // 我们就可以在这里 对请求配置 做点手脚
  // 当有 token 的时候，我们就加到请求头里面
  if (store.state.user.token) {
    // 判断token是否过期
    if (IsCheckTimeOut()) {
      // token过期，清空token和userinfo，跳转到登录页，返回失败的promise
      // user.actions.logout()
      store.dispatch(user.actions.logout.nsname)
      router.push('/login')
      return Promise.reject(new Error('登录已过期，请重新登录'))
    }
    // 这个是不是直接给 headers 赋值为一个新对象了
    reqConfig.headers = {
      Authorization: `Bearer ${store.state.user.token}`
    }
    // if (reqConfig.isRefreshToken) {
    //   reqConfig.headers.Authorization = `Bearer ${store.state.userToken?.refresh_token}`
    // } else {
    //   reqConfig.headers.Authorization = `Bearer ${store.state.userToken?.token}`
    // }
    // 下面的代码和上面是等价的
    // reqConfig.headers.Authorization = `Bearer ${
    //   reqConfig.isRefreshToken
    //   ? store.state.userToken?.refresh_token
    //   : store.state.userToken?.token
    // }`
  }
  return reqConfig
}, (error) => {
  return Promise.reject(error)
})

// 响应拦截器
service.interceptors.response.use((response) => {
  // console.log(response)
  const { success, message, data } = response.data
  if (success) {
    return data
  } else {
    Message.error(message)
    return Promise.reject(new Error(message)) // 返回执行错误 让当前执行链跳出成功 进入catch
  }
}, (error) => {
  // 判断错误码是不是10002
  // if (error.response && error.response.data && error.response.data.code === 10002) {
  if (error.response?.data?.code === 10002) {
    store.dispatch(user.actions.logout.nsname)
    Message.error('登录已过期，请重新登录')
    router.push('/login')
  } else {
    Message.error(error.message)
  }
  return Promise.reject(error) // 返回执行错误 让当前执行链跳出成功 进入catch
})

function IsCheckTimeOut() {
  // const TimeOut = 10
  // const currentTimeStamp = Date.now()
  // const timeStamp = getTimeStamp()
  // return (currentTimeStamp - timeStamp) / 1000 > TimeOut
  return !getTimeStamp()
}

export default service
